'use strict';
const fs = require('fs');
// node.js 路径操作对象
const path = require('path');
// 故名思意 异步二进制 写入流
const awaitWriteStream = require('await-stream-ready').write;
// 管道读入一个虫洞。
const sendToWormhole = require('stream-wormhole');
// 当然你也可以不使用这个 哈哈 个人比较赖
// 还有我们这里使用了egg-multipart
const md5 = require('md5');

const Controller = require('egg').Controller;

class HomeController extends Controller {


  /**
   * 普通用户接口----------------------------start------------------------------
   */
  async getUserList () {
    const { ctx } = this;
    console.log(ctx.request.ip);
    ctx.body = ctx.query;
    console.log(ctx.query);
    const user = await this.ctx.service.userService.getUserList(ctx.body);
    // console.log(user);
    ctx.body = user;
  }
  /**
   * 普通用户接口-------------------------------end---------------------------------
   */

  /**
   * 授权用户接口----------------------------start------------------------------
   */
  async getUserListHavePermission () {
    const { ctx } = this;
    ctx.body = ctx.query;
    console.log(ctx.query);
    const user = await this.ctx.service.userService.getUserListHavePermission(ctx.body);
    // console.log(user);
    ctx.body = user;
  }
  /**
   * 授权用户接口----------------------------end------------------------------
   */

  /**
   * 申请授权用户列表接口----------------------------start------------------------------
   */
  async getUserListApply () {
    const { ctx } = this;
    ctx.body = ctx.query;
    console.log(ctx.query);
    const user = await this.ctx.service.userService.getUserListApply(ctx.body);
    // console.log(user);

    ctx.body = user;
  }

  /**
   * 获取医护人员列表
   */
  async getUserListByyihu () {
    const { ctx } = this;
    ctx.body = ctx.query;
    console.log(ctx.query);
    const user = await this.ctx.service.userService.getUserListByyihu(ctx.body);
    // console.log(user);

    ctx.body = user;
  }
  /**
 * 获取医护详细
 */
  async geYihuDetail () {
    console.log('**********geYihuDetail****************');
    const { ctx } = this;
    const id = ctx.params.id;
    console.log(id);

    const user = await this.ctx.service.userService.geYihuDetail(id);
    // console.log(user);

    ctx.body = user;
  }

  /**
   * 获取护士列表----------------------------start------------------------------
   */
  async getHugong () {
    const { ctx } = this;
    // ctx.body = ctx.query;
    // console.log(ctx.query);
    let retrunMap = {};
    try {
      const user = await this.ctx.service.userService.getHugong();
      retrunMap = { code: '1', msg: '获取成功', data: user };
    } catch (error) {
      retrunMap = { code: '0', msg: '获取失败' };
      console.log(error);

    }
    // console.log(user);
    ctx.body = retrunMap;
  }

  /**
   * 申请授权用户列表接口----------------------------end------------------------------
   */

  /**
    * 模糊查询的接口-----------------------------------
    */
  async likeQuerying () {
    const { ctx } = this;
    // 获取
    ctx.body = ctx.request.body;
    console.log(ctx.body);
    // 传给service去查询数据库
    const users = await this.ctx.service.userService.likeQuerying(ctx.body);
    console.log(users);
    // 返回
    ctx.body = users;
  }
  /**
 * 通过账号获取用户
 */
  async findUserByAccount () {
    const { ctx } = this;
    // 获取
    const account = ctx.params.account;
    let retrunMap = {};
    try {
      const users = await this.ctx.service.userService.findUserByAccount(account);
      console.log(users);
      if (users) {
        retrunMap = { code: '1', msg: '获取成功', data: users };
      } else {
        retrunMap = { code: '0', msg: '获取失败' };
      }

    } catch (err) {
      retrunMap = { code: '0', msg: '获取失败' };
      console.log(err);

    }
    ctx.body = retrunMap;

  }


  /**
   * 上传文件的功能-------------------start------------------------------
   */
  async uploadUser () {
    const ctx = this.ctx;
    const stream = await ctx.getFileStream();
    // console.log('-----------------------------stream----------------------------');
    // console.log(stream);

    // 新建一个文件名
    // const filename = stream.filename
    //   .extname(stream.filename)
    //   .toLocaleLowerCase();
    // 新建一个文件名
    const filename = md5(stream.filename) + path
      .extname(stream.filename)
      .toLocaleLowerCase();
    console.log('--------------------------filename---------------------------');
    console.log(filename);
    // 文件生成绝对路径
    // 当然这里这样市不行的，因为你还要判断一下是否存在文件路径
    const target = path.join(this.config.baseDir, 'app/public/uploads', filename);
    // 生成一个文件写入 文件流
    const writeStream = fs.createWriteStream(target);
    try {
      // 异步把文件流 写入
      await awaitWriteStream(stream.pipe(writeStream));
    } catch (err) {
      // 如果出现错误，关闭管道
      await sendToWormhole(stream);
      throw err;
    }
    // 文件响应
    ctx.body = {
      url: '/public/uploads/' + filename,
    };
  }
  /**
   * 上传文件的功能---------------end----------------------------------
   */

  /**
    * 审批接口------------start--------------------------------
    */
  async approvingUser () {

    const { ctx } = this;
    // 1.获取前端传来的请求授权信息
    ctx.body = ctx.request.body;
    console.log(ctx.body);
    let retrunMap = {};

    if (ctx.body.hasOwnProperty('id')) {
      const id = ctx.body.id; // 读取用户id
      // const result = ctx.body.result; // 获取要求的授权状态
      let transaction;

      // const params = {
      //   id,
      // //  role_id: ctx.body.role_id,
      // };
      try {
        // 建立事务对象
        transaction = await this.ctx.model.transaction();
        // let user;
        let status;
        //  if (result === '1') {
        // eslint-disable-next-line prefer-const
        status = 2;

        // 2.发起授权并更改数据库
        // eslint-disable-next-line no-const-assign
        const user = await this.ctx.service.userService.approvingUser(id, status, transaction);// 发,去service更改授权状态

        console.log(user);
        // } else {
        //   status = 3;
        //   // 2.发起授权并更改数据库
        //   // eslint-disable-next-line no-const-assign
        //   user = await this.ctx.service.userService.approvingUser(id, status, transaction);// 发去service更改授权状态
        //   console.log(user);
        // }

        // const permission = await this.ctx.service.permissionsService.update(ctx.body, transaction); // 更新权限表授权信息
        //  const record = await this.ctx.service.approvalService.saveApply(ctx.body, transaction);// 保存审批记录
        // await this.ctx.service.curdService.update(params, transaction);
        //  console.log(record);
        retrunMap = { code: '1', msg: '审批提交成功' };// 封装成功授权返回报文
        // 提交事务
        await transaction.commit();
      } catch (err) {
        // 事务回滚
        await transaction.rollback();
        retrunMap = { code: '0', msg: '审批提交失败' };
        throw err;
      }

    } else { // 没有获取到，直接返回数据不正确
      retrunMap = { code: '0', msg: '审批提交失败' };
    }
    // 3.返回结果
    ctx.body = retrunMap;
  }
  /**
    * 申请授权接口------------end--------------------------------
    */

  /**
    * 撤销权限接口-----undo-------start--------------------------------
    */
  async undoUser () {
    const { ctx } = this;
    // 1.获取前端传来的请求授权信息
    ctx.body = ctx.request.body;
    console.log(ctx.body);
    // 2.发起授权并更改数据库
    // eslint-disable-next-line no-const-assign
    const id = ctx.body.id; // 读取用户id
    const status = ctx.body.status; // 获取要求的授权状态
    let retrunMap = {};
    let user;
    // let status;
    let transaction;
    try {

      // 建立事务对象
      transaction = await this.ctx.model.transaction();
      user = await this.ctx.service.userService.approvingUser(id, status, transaction);// 发去service更改授权状态\
      retrunMap = { code: '1', msg: '撤销成功' };
      // 提交事务
      await transaction.commit();
    } catch (err) {
      console.log(err);
      retrunMap = { code: '0', msg: '撤销失败' };
      // 事务回滚
      await transaction.rollback();
    }

    // console.log(user);

    // 3.返回结果
    ctx.body = retrunMap;
  }

  /**
   * 获取用户信息接口
   */
  async getUserInfo () {
    const { ctx } = this;
    // 1.获取前端传来的请求授权信息
    const token = ctx.request.get('Authorization').split(' ')[1];
    const ip = ctx.ip;

    const re = ctx.app.jwt.verify(token, ctx.app.config.jwt.secret);
    console.log(re);

    if (re.hasOwnProperty('id')) {
      const users = await this.ctx.service.curdService.getDataByPk(re.id);
      // console.log(users);
      ctx.body = users;
    } else {
      ctx.body = {};
    }

    console.log(ip);
    // console.log(token);
  }

}

module.exports = HomeController;
